package com.gustavo.sistema.dao.jdbc;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.gustavo.sistema.dao.ClienteDao;
import com.gustavo.sistema.dao.ErroDeBancoDeDados;
import com.gustavo.sistema.model.Cliente;

public class ClienteDaoJdbc extends DaoJdbc implements ClienteDao {
	
	private static final String INSERIR_CLIENTE = "insert into cliente (cpf, email, endereco, nome, data_cadastro, renda) values (?,?,?,?,?,?);";
	private static final String ATUALIZA_CLIENTE = "update cliente set cpf=?, email =?, endereco=?, nome=?, data_cadastro=?, renda=? where id = ?";
	private static final String EXCLUI_CLIENTE = "delete from cliente where id=?";
	private static final String LISTAR_CLIENTE = "select id,cpf, email, endereco, nome, data_cadastro, renda from cliente ORDER BY nome";	
	

	public ClienteDaoJdbc() {
	}

	
	@Override
	public boolean inserirCliente(Cliente cliente) throws ErroDeBancoDeDados {
		
		try {
			// abre uma conexao com banco
			abrirConexao();

			// preenche a query para realizar o "insert"
			PreparedStatement preparedStatement = conexao.prepareStatement(INSERIR_CLIENTE);

			int i = 1;
			preparedStatement.setString(i++, cliente.getCpf());
			preparedStatement.setString(i++, cliente.getEmail());
			preparedStatement.setString(i++, cliente.getEndereco());
			preparedStatement.setString(i++, cliente.getNome());
			preparedStatement.setDate(i++, new Date(cliente.getDataCadastro().getTime()));
			preparedStatement.setFloat(i++, cliente.getRenda());

			// caso a operacao seja realizada, retorna true
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			// caso contrario retorna false
			return false;

		} catch (ClassNotFoundException e) {
			// Caso ocorra erro ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}		
					

	@Override
	public boolean atualizarCliente(Cliente cliente) throws ErroDeBancoDeDados {
		
		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(ATUALIZA_CLIENTE);

			int i = 1;
			preparedStatement.setString(i++, cliente.getCpf());
			preparedStatement.setString(i++, cliente.getEmail());
			preparedStatement.setString(i++, cliente.getEndereco());
			preparedStatement.setString(i++, cliente.getNome());
			preparedStatement.setDate(i++, new Date(cliente.getDataCadastro().getTime()));
			preparedStatement.setFloat(i++, cliente.getRenda());
			preparedStatement.setInt(i++, cliente.getId());
			
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			return false;
		} catch (ClassNotFoundException e) {
			// Caso ocorra erri ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}
		
		
	@Override
	public boolean excluirCliente(Integer id) throws ErroDeBancoDeDados {
		
		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(EXCLUI_CLIENTE);

			int i = 1;
			preparedStatement.setInt(i++, id);

			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			return false;
		} catch (ClassNotFoundException e) {
			// Caso ocorra erri ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}
				

	@Override
	public List<Cliente> listarClientes() throws ErroDeBancoDeDados {

		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(LISTAR_CLIENTE);

			// Executa a consulta SQL neste objeto PreparedStatement e retorna o objeto ResultSet gerado pela consulta.
			ResultSet rs = preparedStatement.executeQuery();

			List<Cliente> clientes = new ArrayList<Cliente>();

			while (rs.next()) {
				

				Cliente cliente = new Cliente();
				cliente.setId(rs.getInt("id"));
				cliente.setCpf(rs.getString("cpf"));
				cliente.setEmail(rs.getString("email"));
				cliente.setNome(rs.getString("endereco"));
				cliente.setDataCadastro(rs.getDate("data_cadastro"));
				cliente.setRenda(rs.getFloat("renda"));
				
				clientes.add(cliente);
			}
			return clientes;

		} catch (ClassNotFoundException e) {
			// Caso ocorra erro ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de dados
			throw new ErroDeBancoDeDados(e);

		} finally {

			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}

	}
	
	

}
